#ifndef MY_JOYSTICK_H
#define MY_JOYSTICK_H
#include<../include/listop.h>
#include<stdbool.h>

extern int ctr_mode ;
extern int ctr_mode_shift ;

// 操纵杆相关的全局变量
extern int joystick_fd;             // 表示操纵杆文件描述符
extern int joystick_result_code;      // 表示操纵杆相关操作返回的结果码
extern char joystick_num_axes ;        // 表示操纵杆的轴数量
extern char joystick_num_buttons ;     // 表示操纵杆的按钮数量
extern char joystick_name[128] ;     // 表示操纵杆设备的名称
extern unsigned int joystick_button_state ;  // 表示操纵杆按钮的状态

extern struct js_event joystick_event;      // 表示操纵杆事件

// 结构体定义
typedef struct joystick_ctx {  
    struct list_head list;     // 链表节点
    int i4_js_fd;              // 操纵杆文件描述符
    unsigned int i4_op_block;  // 操作模式（阻塞 / 非阻塞）
} JOYSTICK_CTX_T;

typedef struct _axes_t {  
    int x;  
    int y;  
} AXES_T; 

extern   AXES_T* joystick_axes_status ;  // 表示操纵杆初始化状态

// 全局变量
extern struct list_head _t_js_ctx_head;  // 操纵杆上下文链表

int joystick_open(const char* cp_js_dev_name, int i4_block);
int joystick_close(int i4_fd) ;
int joystick_read_ready(int i4_fd);
void debug_list(void) ;
int joystick_read_one_event(int i4_fd, struct js_event* tp_jse);

// 操纵杆线程处理函数
void* joystick_thread(void *arg);
void process_button_event(int button_number, int value);
void process_axis_event(const struct js_event* jse);
#endif